import axios from 'axios'
import { getToken, clearToken, clearUserId } from './token'
// import store from '@/store' // 关键改动：移除顶层导入，打破循环依赖
import { clearUserInfo } from '@/store/modules/user'
import { showMessage } from '@/store/modules/message'

const request = axios.create({
    // baseURL: '/api',
    baseURL: 'http://123.56.100.154:8081',
    // 添加响应类型配置
    responseType: 'json',
    // 设置默认请求头
    headers: {
        'Accept': 'application/json;charset=UTF-8'
    }
})

// 添加请求拦截器
request.interceptors.request.use((config) => {
    // 获取token并添加到请求头
    const token = getToken()
    
    if (token) {
        config.headers.authorization = token
    } else {
        console.log('没有找到token'); // 添加调试日志
    }
    
    // 根据请求方法设置Content-Type
    // GET请求不设置Content-Type，让浏览器自动处理
    if (config.method === 'POST' || config.method === 'PUT' || config.method === 'PATCH') {
        config.headers['Content-Type'] = 'application/json;charset=UTF-8'
    }
    
    return config
}, (error) => {
    return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use((response) => {
    // 2xx 范围内的状态码都会触发该函数。
    return response.data
}, (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    console.error('请求错误:', error.response?.data);
    
    // 处理中文乱码问题
    let errorMessage = '请求失败'
    if (error.response?.data?.msg) {
        try {
            // 尝试解码中文消息
            const decoder = new TextDecoder('utf-8')
            const encoder = new TextEncoder()
            const bytes = encoder.encode(error.response.data.msg)
            errorMessage = decoder.decode(bytes)
        } catch (e) {
            // 如果解码失败，使用原始消息
            errorMessage = error.response.data.msg
        }
    }
    
    if (error.response && error.response.status === 401) {
        // 动态导入store，仅在需要时执行
        import('@/store').then(({ default: store }) => {
            store.dispatch(clearUserInfo())
            clearUserId() // 同时清除userId
            store.dispatch(showMessage({ message: errorMessage || '未登录或登录已过期，请重新登录', type: 'warn' }))
            window.location.hash = '/login';
        });
    }
    
    return Promise.reject(error)
})

export { request }